package com.luci.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * jwt工具类
 *
 * @author yuyanan
 * @version 1.0
 * @date 18-11-22
 */
@Slf4j
@Data
public class JwtUtils {


    private static final String OWN_PARAMS = "own_params";

    private static final String NONE = "none";
    private static int ms = 60 * 60 * 1000;

    /**
     * 用户信息转换成jwt标签
     *
     * @param jwtUser 用户对象
     * @param secret 密钥
     * @param expireDays 超时时间
     * @return String
     */
    public static String buildJWT(Object jwtUser, String secret, byte expireDays) {
        Date expireDate = new Date(System.currentTimeMillis() + (expireDays * ms));

        HashMap<String, Object> map = new HashMap<>(6);
        map.put(OWN_PARAMS, jwtUser);

        log.info("secret is:{}", secret);
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        JwtBuilder builder = Jwts.builder()
                                 // JWT_ID
                                 .setId(UUID.randomUUID().toString())
                                 // 接受者
                                 .setAudience(NONE)
                                 // 自定义属性
                                 .setClaims(map)
                                 // 主题
                                 .setSubject(NONE)
                                 // 签发者
                                 .setIssuer(NONE)
                                 // 签发时间
                                 .setIssuedAt(new Date())
                                  // 失效时间
                                 //.setNotBefore(new Date())
                                 // 过期时间
                                 .setExpiration(expireDate).signWith(signatureAlgorithm, secret);
        // 签名算法以及密匙
        return builder.compact();
    }

    /**
     * jwt 反序列化
     *
     * @param token String
     * @param secret 密钥
     * @return Claims Claims
     */
    public static Claims parseJWT(String token, String secret) {
        return Jwts.parser()
                   // 验签
                   .setSigningKey(secret)
                   // 去掉 Bearer
                   .parseClaimsJws(token).getBody();
    }

    /**
     * jwt解析
     *
     * @param token String
     * @param secret 密钥
     * @return 自定义信息
     */
    public static Object parseJwtToBean(String token, String secret) {
        Claims claims = parseJWT(token, secret);
        if (claims == null) {
            return null;
        }
        return claims.get(OWN_PARAMS);
    }
}
